/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.unifor.sd.bolsa.rmi;

import br.unifor.sd.bolsa.interfaces.MessageListener;
import br.unifor.sd.bolsa.interfaces.RemoteListener;
import br.unifor.sd.bolsa.interfaces.ServidorInterface;
import br.unifor.sd.bolsa.util.Colecao;
import java.io.IOException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Pedro
 */
public class ServidorImplRMI implements ServidorInterface,RemoteListener {

    private Registry registry;
    private ServidorRemote stub;
    private ServidorRemote referenciaLocal;
    private List<ClienteRemote> clientes;
    private Colecao colecao ;

    public void iniciar(int porta) throws IOException {
        clientes = new ArrayList<ClienteRemote>();
        colecao = new Colecao();
        colecao.popularRandomico();
        referenciaLocal = new ServidorRemoteImpl();
        referenciaLocal.addListener(this);
        stub = (ServidorRemote) UnicastRemoteObject.exportObject(referenciaLocal, 0);
        registry = LocateRegistry.createRegistry(porta);
        registry.rebind("Bolsa", stub);
        System.out.println("Servidor no ar");
        

    }

    public void parar() throws IOException {
        
    }

    public void escutar() {
    }

    public void addListener(MessageListener msg) {
        
    }

    public void onMessage(ClienteRemote cr) {
        clientes.add(cr);
        enviarAcoesparaTodos();
    }

    private void enviarAcoesparaTodos() {
        for(ClienteRemote cr:clientes){
            try {
                cr.sendLista(colecao.getLista());
            } catch (RemoteException ex) {
                Logger.getLogger(ServidorImplRMI.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

}
